package com.thp.bigdata.rjon.station;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableComparable;

/**
 * 自定义组合键
 * @author tommy
 *
 */
public class TextPair implements WritableComparable<TextPair>{

	
	/**
	 * 为什么这连个属性都是使用 Text，我认为就是在序列化输出和写入的时候能够更加方便
	 */
	private Text first;    // first 代表的是 气象站的id
	
	private Text second;   // second 则是一个标记符号
	
	// 多使用几个构造方法，能够更加灵活方便
	public TextPair() {
		set(new Text(), new Text());
	}
	
	public TextPair(String first, String second) {
		set(new Text(first), new Text(second));
	}
	
	public TextPair(Text first, Text second) {
		set(first, second);
	}
	
	
	public void set(Text first, Text second) {
		this.first = first;
		this.second = second;
	}

	public Text getFirst() {
		return first;
	}

	
	public Text getSecond() {
		return second;
	}

	
	// 序列化操作：将对象转换为字节流并写入到输出流out中
	@Override
	public void write(DataOutput out) throws IOException {
		first.write(out);
		second.write(out);
	}
	// 序列化操作 ： 从输入流中读取字节流反序列化为对象
	@Override
	public void readFields(DataInput in) throws IOException {
		first.readFields(in);
		second.readFields(in);
	}

	// 这个hashCode 需要重写，重写是为了保证hashCode的性能
	@Override
	public int hashCode() {
		return first.hashCode()*163 + second.hashCode();
	}
	
	// equals() 方法重写，当first跟second都一样时，就说明两个数据是相同的额数据
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof TextPair) {
			TextPair tp = (TextPair) obj;
			return first.equals(tp.first) && second.equals(tp.second);
		}
		return false;
	}
	
	
	
	/*@Override
	public int compareTo(TextPair tp) {
		if(!first.equals(tp.first)) {
			return first.compareTo(tp.first);
		} else if(!second.equals(tp.second)) {
			return second.compareTo(second);
		} 
		return 0;
	}*/
	/*public int compareTo(TextPair o) {
		// TODO Auto-generated method stub
		if (!first.equals(o.first)) {
			return first.compareTo(o.first);
		} else if (!second.equals(o.second)) {
			return second.compareTo(o.second);
		} else {
			return 0;
		}
	}*/
	
	// compareTo() 方法写的时候一定要小心一点，一旦写错了，就会对整个程序造成影响
	// compareTo()方法需要重写，因为我们是将TextPair最想作为key输出的，会调用compareTo()方法进行比较
	// 有了compareTo() 方法我们设置的标识属性 second才会生效
	@Override
	public int compareTo(TextPair o) {
		if(!first.equals(o.first)) {
			return first.compareTo(o.first);
		} else if(!second.equals(o.second)) {
			return second.compareTo(o.second);
		}
		return 0;
	}
	
	
	@Override
	public String toString() {
		return first + "\t" + second;
	}
	
}
